#include "viewer.h"
#include "shapes/Sphere.h"

using namespace std;
using namespace qglviewer;
using namespace shapes;



Viewer::Viewer(QWidget *parent)
    : QGLViewer(parent)
{

}

Viewer::~Viewer()
{

}

// Draw a textured sphere
void Viewer::draw()
{
//	Vec blanco(1, 1, 1), negro(0, 0, 0);
//	//Ponemos el material
//	glMaterialfv(GL_FRONT, GL_SPECULAR, blanco * 0.25);
//	glMaterialfv(GL_FRONT, GL_AMBIENT, blanco * 0.2);
//	glMaterialfv(GL_FRONT, GL_DIFFUSE, blanco * 0.8);
//	glMaterialf(GL_FRONT, GL_SHININESS, 15);

	//Traemos esta textura
	glBindTexture(GL_TEXTURE_2D, textureName);

	glPushMatrix();
		world.draw();
	glPopMatrix();
}

void Viewer::init()
{
  setSceneCenter(Vec(0,0,0));
  setSceneRadius(4.0);
  showEntireScene();

  restoreFromFile();
  //El objeto grafico
  world.setRadix(3.0);
  world.setSlices(40);
  world.setStacks(30);

  //El color del fondo
  setBackgroundColor(QColor(0, 0, 0, 1));

  //Volvemos al estado de default
  glDisable(GL_COLOR_MATERIAL);
  //Como la iluminacion esta prendida de default solo le damos propiedades a la luz
//  Vec blanco(1, 1, 1), negro(0, 0, 0);
//  glLightfv(GL_LIGHT0, GL_DIFFUSE, blanco);
//  glLightfv(GL_LIGHT0, GL_SPECULAR, blanco);
//  glLightfv(GL_LIGHT0, GL_AMBIENT, negro);

  //Back face culling
  glEnable(GL_CULL_FACE);
  glCullFace(GL_BACK);

  //Modo de textura activado
  glEnable(GL_TEXTURE_2D);
  //Tipo de filtrado para las texturas
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  //Comportamiento de la textura si no corresponde 1 a 1, es un safe fall en este ejemplo nunca pasa
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  //Modo para poner la textura
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  //Activamos la correccion alpha
  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  loadImage("textures/world32k.png");

}

void Viewer::loadImage(QString imageName) {
	//Si no hay imagen que cargar
	if (imageName.isEmpty()) {
		return;
	}

	//Crear un objeto imagen
	QImage img(imageName);

	//No se pudo crear
	if (img.isNull()) {
		qWarning("Imposible abrir imagen %s el archivo no existe o ese formato no esta soportado", imageName.toLatin1().constData());
		return;
	}

	// Calculamos la potencia de 2 mas cercana al tamaño
	// Intentamos 128 si no podemos calcular
	int newWidth  = 1<<(int)(1+log(img.width() -1+1E-3) / log(2.0));
	int newHeight = 1<<(int)(1+log(img.height()-1+1E-3) / log(2.0));
	//Esclamos el espacio de textura de 0 a 1
	u_max = img.width()  / (float)newWidth;
	v_max = img.height() / (float)newHeight;

	if ((img.width() != newWidth) || (img.height() != newHeight)) {
	  qWarning("Image size set to %dx%d pixels", newWidth, newHeight);
	  img = img.copy(0, 0, newWidth, newHeight);
	}

	ratio = newWidth / float(newHeight);
	//Este metodo abstare el binding de la textura
	textureName = bindTexture(img, GL_TEXTURE_2D, GL_RGBA, QGLContext::MipmapBindOption|QGLContext::LinearFilteringBindOption|QGLContext::InvertedYBindOption);


}


